#include "../include/header.h"

/**
 * 利用dup实现重定向功能:
1.重定向标准输出到文件
2.标准输入重定向到文件, 从文件读数据
3.实现在标准输出重定向到文件, 复原,再重定向到文件的反复横跳
4.重定向标准错误到文件server.log中, 实现类似打印日志的功能
*/

void func1(char *path){
	int fd = open(path, O_RDWR | O_TRUNC);
	ERROR_CHECK(fd, -1, "open");

	close(STDOUT_FILENO);
	int fd_cp = dup(fd);
	printf("重定向标准输出到文件\n");
	

	fflush(stdout);
	close(fd_cp);
	close(fd);
}


void func2(char* path){

	close(STDIN_FILENO);
	int fd = open(path, O_RDWR);
	ERROR_CHECK(fd, -1, "open");

	char str[1024];
	scanf("%s", &str);
	printf("%s", str);


	fflush(stdout);
	close(fd);
}


// 3.实现在标准输出重定向到文件, 复原,再重定向到文件的反复横跳
void func3(char* path){

	int fd = open(path, O_RDWR);
	ERROR_CHECK(fd, -1, "open");

	// 备份stdout
	int stdout_bak = 7;
	dup2(STDOUT_FILENO, stdout_bak);

	//标准输出重定向到文件
	dup2(fd, STDOUT_FILENO);
	printf("重定向1\n");
	fflush(stdout);

	//重定向会屏幕
	dup2(stdout_bak, STDOUT_FILENO);
	printf("回屏幕\n");

	fflush(stdout);
	close(fd);
	close(stdout_bak);

}

//4.重定向标准错误到文件server.log中, 实现类似打印日志的功能
void func4(){
	int fd = open("server.log", O_RDWR | O_TRUNC | O_CREAT, 0666);
	ERROR_CHECK(fd, -1, "open");

	//标准输出重定向到文件
	dup2(fd, STDERR_FILENO);


	perror("除法溢出");
	exit(-1);

	close(fd);
}



int main(int argc, char* argv[]){
	ARGS_CHECK(argc, 1);
	func4();

	return 0;
}